package app.android.alampang.ui.activity;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import java.util.List;

import app.android.alampang.R;
import app.android.alampang.loader.PlaceInfoLoader;
import app.android.alampang.model.Place;
import app.android.alampang.utility.NavigationService;

public class MapsActivity extends FragmentActivity implements GoogleMap.OnInfoWindowClickListener, GoogleMap.InfoWindowAdapter{

    private GoogleMap mMap; // Might be null if Google Play services APK is not available.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapIfNeeded();
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    /**
     * Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
     * installed) and the map has not already been instantiated.. This will ensure that we only ever
     * call {@link #setUpMap()} once when {@link #mMap} is not null.
     * <p/>
     * If it isn't installed {@link SupportMapFragment} (and
     * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
     * install/update the Google Play services APK on their device.
     * <p/>
     * A user can return to this FragmentActivity after following the prompt and correctly
     * installing/updating/enabling the Google Play services. Since the FragmentActivity may not
     * have been completely destroyed during this process (it is likely that it would only be
     * stopped or paused), {@link #onCreate(Bundle)} may not be called again so we should call this
     * method in {@link #onResume()} to guarantee that it will be called.
     */
    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Set move to middle of marker place (Pong-sa-nook Temple)
            CameraUpdate c = CameraUpdateFactory.newLatLngZoom(new LatLng(18.294308, 99.496780), 12.5f);
            mMap.moveCamera(c);
            mMap.setOnInfoWindowClickListener(this);

            mMap.setInfoWindowAdapter(this);

            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    /**
     * This is where we can add markers or lines, add listeners or move the camera. In this case, we
     * just add a marker near Africa.
     * <p/>
     * This should only be called once and when we are sure that {@link #mMap} is not null.
     */
    private void setUpMap() {
        List<Place> ls = PlaceInfoLoader.getAllPlaces();
        for (Place l : ls)
        {
            float lat = Float.parseFloat(l.getLatitude());
            float lng = Float.parseFloat(l.getLongitude());

            mMap.addMarker(
                    new MarkerOptions()
                            .position(new LatLng(lat, lng))
                            .title(l.getName()));
        }

    }

    @Override
    public void onInfoWindowClick(Marker marker){
        //Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show();
        Place place = PlaceInfoLoader.getPlaceByName(marker.getTitle());

        if (place != null) {

            Bundle param = new Bundle();
            param.putString(Place.PARSING_NAME, place.toJSONObject().toString());

            NavigationService.getInstance()
                    .navigate(this, PlaceDetailActivity.class, param, false);
        }
    }

    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }

    @Override
    public View getInfoContents(Marker marker) {
        View v = getLayoutInflater().inflate(R.layout.custom_info_window_marker, null);
        TextView txtPlaceName = (TextView) v.findViewById(R.id.txt_placeName);
        ImageView imgPlace = (ImageView) v.findViewById(R.id.img_place);

        Place place = PlaceInfoLoader.getPlaceByName(marker.getTitle());

        if (place != null) {
            txtPlaceName.setText(place.getName());
            imgPlace.setBackgroundResource(place.getImageDrawable());
        }
        return v;
    }
}
